home *** CD-ROM | disk | FTP | other *** search
/ Delphi Informant Complete 1995 - 2000 / Delphi Informant Complete 1995 to 2000.iso / Delphi Informant Magazine Complete Works SOURCE CODE 1995.rar / 1995 / JUN / JA9506 / label3d.pas < prev    next >
Pascal/Delphi Source File  |  1995-05-04  |  6KB  |  210 lines

  1. unit Label3d;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, WinTypes, WinProcs, Controls,
  7.   StdCtrls, Classes, Graphics, Menus;
  8.  
  9. type
  10.   TLabelStyle = (lsRaised, lsLowered);
  11.  
  12.   TLabel3D = class(TCustomLabel)
  13.   private
  14.     FOffset:     integer;
  15.     FLabelStyle: TLabelStyle;
  16.     FAsButton:   Boolean;
  17.     procedure SetOffset(Value: Integer);
  18.     procedure SetLabelStyle(Value: TLabelStyle);
  19.     procedure SetAsButton(Value: Boolean);
  20.   protected
  21.     procedure Paint; override;
  22.     procedure MouseDown(Button: TMouseButton;
  23.                         Shift: TShiftState;
  24.                         X, Y: Integer); override;
  25.     procedure MouseMove(Shift: TShiftState;
  26.                         X, Y: Integer); override;
  27.     procedure MouseUp(Button: TMouseButton;
  28.                       Shift: TShiftState;
  29.                       X, Y: Integer); override;
  30.   public
  31.     constructor Create(AOwner: TComponent); override;
  32.   published 
  33.     property Offset: Integer read FOffset
  34.                              write SetOffset default 1;
  35.     property Align;
  36.     property Alignment;
  37.     property AsButton: Boolean read FAsButton
  38.                                write SetAsButton;
  39.     property AutoSize;
  40.     property Caption;
  41.     property Enabled;
  42.     property FocusControl;
  43.     property Font;
  44.     property LabelStyle: TLabelStyle read FLabelStyle
  45.                                      write SetLabelStyle;
  46.     property ShowAccelChar;
  47.     property ShowHint;
  48.     property Visible;
  49.     property WordWrap;
  50.     property OnClick;
  51.     property OnDblClick;
  52.     property OnMouseDown;
  53.     property OnMouseMove;
  54.     property OnMouseUp;
  55.   end;
  56.  
  57. procedure Register;
  58.  
  59. implementation
  60.  
  61. constructor TLabel3D.Create(AOwner: TComponent);
  62. begin
  63.   inherited Create(AOwner);  { Call TCustomLabel's Create }
  64.   FOffset := 1;        { FOffset matches property default }
  65.   Transparent := True;         { Transparent must be True }
  66.   with Font do begin                { Set up default font }
  67.     Name := 'Arial';
  68.     Size := 12;
  69.     Color := clBlue;
  70.     Style := [fsBold];
  71.   end;
  72. end;
  73.  
  74. procedure TLabel3D.Paint;
  75. const
  76.   { Array that encapsulates some of
  77.     WinProcs.DrawText's flags }
  78.   Alignments: array[TAlignment] of Word =
  79.    (DT_LEFT, DT_RIGHT, DT_CENTER);
  80. var
  81.   TempRect: TRect;
  82.   Text: array[0..255] of Char;
  83.   OldColor: TColor;
  84. begin
  85.   Canvas.Brush.Style := bsClear;   { set clear background }
  86.   Canvas.Font := Self.Font;   { insure Canvas Font is set }
  87.   OldColor := Font.Color;             { save font's color }
  88.   Canvas.Font.Color := clWhite;         { make font white }
  89.   { Create a rect that is offset for the top bevel }
  90.   TempRect := Rect(ClientRect.Left - Offset,
  91.                    ClientRect.Top - Offset,
  92.                    ClientRect.Right - Offset,
  93.                    ClientRect.Bottom - Offset);
  94.   GetTextBuf(Text, SizeOf(Text));   { Get Label's Caption }
  95.   { Draw offset text }
  96.   DrawText(Canvas.Handle, Text, StrLen(Text),
  97.            TempRect, DT_EXPANDTABS or
  98.            DT_WORDBREAK or Alignments[Alignment]);
  99.   Canvas.Font.Color := clBlack;     { make font white }
  100.   { Create rect that is offset for the bottom bevel }
  101.   TempRect := Rect(ClientRect.Left + Offset,
  102.                    ClientRect.Top + Offset,
  103.                    ClientRect.Right + Offset,
  104.                    ClientRect.Bottom + Offset);
  105.   { Draw the offset text }
  106.   DrawText(Canvas.Handle, Text, StrLen(Text),
  107.            TempRect, DT_EXPANDTABS or
  108.            DT_WORDBREAK or Alignments[Alignment]);
  109.   Canvas.Font.Color := OldColor;  { Restore the old color }
  110.   inherited Paint;                { Call inherited Paint }
  111. end;
  112.  
  113. procedure TLabel3D.SetOffset(Value: Integer);
  114. begin
  115.   if FOffset <> Value then
  116.     begin
  117.       FOffset := Value;
  118.       Invalidate;
  119.     end;
  120. end;
  121.  
  122. procedure TLabel3D.SetLabelStyle(Value: TLabelStyle);
  123. begin
  124.   if FLabelStyle <> Value then begin
  125.     { Set AsButton property to False if it is True, 
  126.       and weÆre in design mode }
  127.     if FAsButton and
  128.        (csDesigning in ComponentState) then
  129.       SetAsButton(False);
  130.       SetOffset(FOffset * -1);   { Set the FOffset field }
  131.       FLabelStyle := Value;
  132.     end;
  133. end;
  134.  
  135. procedure TLabel3D.SetAsButton(Value: Boolean);
  136. begin
  137.   if FAsButton <> Value then begin
  138.     if Value then
  139.       { if label isn't already raised... }
  140.       if LabelStyle <> lsRaised then begin
  141.         SetLabelStyle(lsRaised);  { raise it }
  142.       end;
  143.     FAsButton := Value;
  144.   end;
  145. end;
  146.  
  147. procedure TLabel3D.MouseDown(Button: TMouseButton;
  148.                              Shift: TShiftState;
  149.                              X, Y: Integer);
  150. begin
  151.   if AsButton then
  152.     begin
  153.       { if it's a left mouse button and the label isn't lowered... }
  154.       if (Button = mbLeft)         and
  155.          (LabelStyle <> lsLowered) and
  156.          Enabled                   then
  157.         SetLabelStyle(lsLowered);  { set Style to Lowered }
  158.     end
  159.   else
  160.     inherited MouseDown(Button, Shift, X, Y);
  161. end;
  162.  
  163. procedure TLabel3D.MouseMove(Shift: TShiftState;
  164.                              X, Y: Integer);
  165. var
  166.   NewState: TLabelStyle;
  167. begin
  168.   if AsButton then begin
  169.     { If it's a left mouse button... }
  170.     if Shift = [ssLeft] then begin
  171.       { the cursor is within the label's client area... }
  172.       if (X >= 0)            and
  173.          (X < ClientWidth)   and
  174.          (Y >= 0)            and
  175.          (Y <= ClientHeight) then
  176.         NewState := lsLowered   { make it Lowered }
  177.       else
  178.         NewState := lsRaised;   { otherwise, Raised }
  179.       if NewState <> FLabelStyle then
  180.         SetLabelStyle(NewState);
  181.     end;
  182.   end
  183.   else
  184.     inherited MouseMove(Shift, X, Y);
  185. end;
  186.  
  187. procedure TLabel3D.MouseUp(Button: TMouseButton;
  188.                            Shift: TShiftState;
  189.                            X, Y: Integer);
  190. begin
  191.   if FAsButton then begin
  192.     { The the cursor is within the label's client area... }
  193.     if (X >= 0)            and
  194.        (X < ClientWidth)   and
  195.        (Y >= 0)            and
  196.        (Y <= ClientHeight) then
  197.       SetLabelStyle(lsRaised);  { Make it Raised }
  198.   end
  199.   else
  200.     inherited MouseUp(Button, Shift, X, Y);
  201. end;
  202.  
  203. procedure Register;
  204. begin
  205.   RegisterComponents('Test', [TLabel3D]);
  206. end;
  207.  
  208. end.
  209.  
  210.